package cn.iocoder.yudao.module.im.service;

import cn.iocoder.yudao.module.im.dal.dataobject.ImConversationDO;

import java.util.List;

/**
 * 会话服务接口
 *
 * @author 芋道源码
 */
public interface ImConversationService {

    /**
     * 创建会话
     *
     * @param userId 用户ID
     * @param targetId 目标ID（用户ID或群组ID）
     * @param conversationType 会话类型
     * @return 会话ID
     */
    Long createConversation(Long userId, Long targetId, Integer conversationType);

    /**
     * 获取会话详情
     *
     * @param conversationId 会话ID
     * @return 会话详情
     */
    ImConversationDO getConversation(Long conversationId);

    /**
     * 获取用户会话列表
     *
     * @param userId 用户ID
     * @return 会话列表
     */
    List<ImConversationDO> getUserConversationList(Long userId);

    /**
     * 根据用户ID、目标ID和会话类型获取会话
     *
     * @param userId 用户ID
     * @param targetId 目标ID
     * @param conversationType 会话类型
     * @return 会话详情
     */
    ImConversationDO getConversationByUserTargetType(Long userId, Long targetId, Integer conversationType);

    /**
     * 更新会话的未读消息数
     *
     * @param conversationId 会话ID
     * @param count 增加的数量
     * @return 是否更新成功
     */
    boolean updateUnreadCount(Long conversationId, Integer count);

    /**
     * 清空会话的未读消息数
     *
     * @param conversationId 会话ID
     * @return 是否清空成功
     */
    boolean clearUnreadCount(Long conversationId);

    /**
     * 设置会话置顶状态
     *
     * @param conversationId 会话ID
     * @param isTop 是否置顶
     * @return 是否设置成功
     */
    boolean setConversationTop(Long conversationId, Boolean isTop);

    /**
     * 设置会话静音状态
     *
     * @param conversationId 会话ID
     * @param isMuted 是否静音
     * @return 是否设置成功
     */
    boolean setConversationMuted(Long conversationId, Boolean isMuted);

    /**
     * 删除会话
     *
     * @param conversationId 会话ID
     * @param userId 用户ID
     * @return 是否删除成功
     */
    boolean deleteConversation(Long conversationId, Long userId);

    /**
     * 更新会话的最后一条消息
     *
     * @param conversationId 会话ID
     * @param messageId 消息ID
     * @return 是否更新成功
     */
    boolean updateLastMessage(Long conversationId, Long messageId);

}